public class UseMethod {
    public static void test1() {
        int a = Method.add(10, 20);
        System.out.println(a);
    }

    //【注意事项】
    //定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行
    //一个方法可以被多次调用
    public static void test2() {
        int a = 10;
        int b = 20;
        System.out.println("第一次调用方法之前");
        int ret = Method.add(a, b);
        System.out.println("第一次调用方法之后");
        System.out.println("ret = " + ret);
        System.out.println("第二次调用方法之前");
        ret = Method.add(30, 50);
        System.out.println("第二次调用方法之后");
        System.out.println("ret = " + ret);
    }

    public static void test3() {
        //使用方法, 避免使用二重循环, 让代码更简单清晰.
        int sum = 0;
        for (int i = 1; i <= 5; i++) {
            sum += Method.factorial(i);
        }
        System.out.println("sum = " + sum);
    }

    //实参和形参的关系
    //Java中方法的形参就相当于sum函数中的自变量n，用来接收sum函数在调用时传递的值的。形参的名字可以随意
    //取，对方法都没有任何影响，形参只是方法在定义时需要借助的一个变量，用来保存方法在调用时传递过来的值
    public static void test4() {
        Method.getSum(10); // 10是实参,在方法调用时，形参N用来保存10
        Method.getSum(100); // 100是实参，在方法调用时，形参N用来保存100
        Method.add(2, 3); // 2和3是实参，在调用时传给形参a和b
        //注意：在Java中，实参的值永远都是拷贝到形参中，形参和实参本质是两个实体

        int a = 10;
        int b = 20;
        Method.swap(a, b);
        System.out.println("main: a = " + a + " b = " + b);

        //可以看到，在swap函数交换之后，形参x和y的值发生了改变，但是main方法中a和b还是交换之前的值，即没有交换成功
        //【原因分析】
        //实参a和b是main方法中的两个变量，其空间在main方法的栈(一块特殊的内存空间)中，而形参x和y是swap方法中
        //的两个变量，x和y的空间在swap方法运行时的栈中，因此：实参a和b与形参x和y是两个没有任何关联性的变量，
        //在swap方法调用时，只是将实参a和b中的值拷贝了一份传递给了形参x和y，因此对形参x和y操作不会对实参a和b产生任何影响
        //注意：对于基础类型来说, 形参相当于实参的拷贝. 即传值调用

        //【解决办法】: 传引用类型参数 (例如数组来解决这个问题)
        int[] arr = {10, 20};
        System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
        Method.swap(arr);
        System.out.println("arr[0] = " + arr[0] + " arr[1] = " + arr[1]);
    }

    public static void test5() {
        
    }

    public static void main(String[] args) {
        //test1();
//        test2();
//        test3();
        test4();
        test5();
    }
}
